package com.dp.client.views;

import java.util.List;

import com.dp.client.dto.IncidenciaDTO;
import com.dp.client.servicios.incidencia.IServiciosIncidencia;
import com.dp.client.servicios.incidencia.IServiciosIncidenciaAsync;
import com.dp.client.servicios.simulacion.IServiciosSimulacion;
import com.dp.client.servicios.simulacion.IServiciosSimulacionAsync;
import com.dp.client.util.Alerts;
import com.dp.client.views.almacenes.AlmacenPrincipal;
import com.dp.client.views.archivo.Archivo;
import com.dp.client.views.archivo.SubirArchivo;
import com.dp.client.views.clientes.ClientePrincipal;
import com.dp.client.views.conexiones.ConexionesPrincipal;
import com.dp.client.views.paquete.PaquetePrincipal;
import com.dp.client.views.reportesCharts.ReportePrincipal;
import com.dp.client.views.simulacion.MapaMundialPrincipal;
import com.dp.client.views.simulacion.SimulationPrincipal;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.DateLabel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.VerticalSplitPanel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;

public class Principal extends Composite {
	private SimplePanel showPanel;
	private ClientePrincipal clientePrincipal = null;
	private MapaMundialPrincipal simulationPrincipal = null;
	private AlmacenPrincipal almacenesPrincipal = null;
	private PaquetePrincipal paquetePrincipal = null;
	private ConexionesPrincipal conexionesPrincipal = null;
	private Archivo subirArchivo = null;
	private SimulationPrincipal simulacionPrincipal = null;
	IServiciosIncidenciaAsync serviciosIncidencia = GWT.create(IServiciosIncidencia.class);
	
	private ClientePrincipal getClientePrincipal(){
		//return clientePrincipal = clientePrincipal == null ? new ClientePrincipal(false)
		//												  : clientePrincipal;
		if (clientePrincipal == null) 
			return clientePrincipal=new ClientePrincipal(false);
		clientePrincipal.actualizar();
		return clientePrincipal;
	}
	private MapaMundialPrincipal getMapaMundialPrincipal(){
		return simulationPrincipal = simulationPrincipal == null ? new MapaMundialPrincipal()
														  : simulationPrincipal;
	}
	private AlmacenPrincipal getAlmacenPrincipal(){
		return almacenesPrincipal = almacenesPrincipal == null ? new AlmacenPrincipal()
														  : almacenesPrincipal;
	}
	private SimulationPrincipal getSimulacionPrincipal(){
		return simulacionPrincipal = simulacionPrincipal == null ? new SimulationPrincipal(true) 
														  : simulacionPrincipal;
	}
	private PaquetePrincipal getPaquetePrincipal(){
		if( paquetePrincipal == null ) paquetePrincipal = new PaquetePrincipal();
		else paquetePrincipal.limpiar();
		return paquetePrincipal;
	}
	
	private ConexionesPrincipal getConexionPrincipal(){
		if (conexionesPrincipal == null ) conexionesPrincipal= new ConexionesPrincipal();
		else conexionesPrincipal.loadData();
		return conexionesPrincipal;
		//return conexionesPrincipal = conexionesPrincipal == null? new ConexionesPrincipal() 
		//											    : conexionesPrincipal;
	}
	
	private Archivo getArchivo()
	{
		if( subirArchivo == null ) subirArchivo = new Archivo();
		return subirArchivo;
	}
	private ReportePrincipal getReportePrincipal(){
		return new ReportePrincipal();
	}
	private Prueba getPrueba(){
		return new Prueba();
	}
	
	public Principal() {
		
		VerticalPanel verticalPanel = new VerticalPanel();
		verticalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		initWidget(verticalPanel);
		verticalPanel.setWidth("100%");
		
		HorizontalPanel loginUpperPanel = new HorizontalPanel();
		verticalPanel.add(loginUpperPanel);
		loginUpperPanel.setSize("100%", "18");
		
		VerticalPanel verticalPanel_1 = new VerticalPanel();
		loginUpperPanel.add(verticalPanel_1);
		verticalPanel_1.setWidth("173px");
		
		Label lblEmpleadoX = new Label("Empleado X");
		lblEmpleadoX.setStyleName("lblEmpleadoX");
		verticalPanel_1.add(lblEmpleadoX);
		
		DateLabel dateLabel = new DateLabel();
		verticalPanel_1.add(dateLabel);
		
		Button btnDesloguearse = new Button("Desloguearse");
		loginUpperPanel.add(btnDesloguearse);
		
		Button btnReiniciarBackend = new Button("Reiniciar Backend");
		btnReiniciarBackend.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				IServiciosSimulacionAsync serv = GWT.create(IServiciosSimulacion.class);
				serv.restart(new AsyncCallback<Void>() {
					
					@Override
					public void onSuccess(Void result) {
						Alerts.crearAlerta("Se pudo reiniciar satisfactoriamente el backend.");
					}
					
					@Override
					public void onFailure(Throwable caught) {
						Alerts.dialogErrorConexion();
					}
				});
			}
		});
		loginUpperPanel.add(btnReiniciarBackend);
		
		DockPanel dockPanel = new DockPanel();
		verticalPanel.add(dockPanel);
		dockPanel.setSize("900", "365");
		
		MenuBar menuBar = new MenuBar(false);
		dockPanel.add(menuBar, DockPanel.NORTH);
		menuBar.setSize("100%", "34");
		
		MenuItem mntmClientes = new MenuItem("Clientes", false, new Command() {
			public void execute() {
				cambiaPanel(getClientePrincipal());
			}
		});
		menuBar.addItem(mntmClientes);
		
		MenuItem mntmAlmacenes = new MenuItem("Almacenes", false, new Command(){
			public void execute(){
				cambiaPanel(getAlmacenPrincipal ());
			}
		});
		menuBar.addItem(mntmAlmacenes);
		
		MenuItem mntmNewItem_1 = new MenuItem("Conexiones", false, new Command() {
			public void execute() {
				cambiaPanel(getConexionPrincipal());
			}
		});
		menuBar.addItem(mntmNewItem_1);
		
		MenuItem mntmPaquetes = new MenuItem("Paquetes", false, (Command) new Command() {
			@Override
			public void execute() {
				cambiaPanel(getPaquetePrincipal());
			}
		});
		menuBar.addItem(mntmPaquetes);
		
		MenuItem mntmMapaMundial = new MenuItem("Mapa mundial", false, new Command() {
			public void execute() {
				cambiaPanel(getMapaMundialPrincipal());
			}
		});
		
//		menuBar.addItem(mntmMapaMundial);
		
		MenuItem mntmSimulacion = new MenuItem("Simulaciones", false, new Command() {
			public void execute() {
				cambiaPanel(getSimulacionPrincipal());
			}
		});
		
		menuBar.addItem(mntmSimulacion);
		
		MenuItem mntmCargarArchivo = new MenuItem("Cargar Archivo", false, new Command() {
			public void execute() 
			{
				cambiaPanel(getArchivo());
			}
		});
		menuBar.addItem(mntmCargarArchivo);
		
		MenuItem mntmReportePrincipal = new MenuItem("Reporte", false, new Command() {
			public void execute() 
			{
				cambiaPanel(getReportePrincipal());
			}
		});
		menuBar.addItem(mntmReportePrincipal);
		
		DockPanel dockPanel_1 = new DockPanel();
		dockPanel.add(dockPanel_1, DockPanel.CENTER);
		
		showPanel = new SimplePanel();
		dockPanel_1.add(showPanel, DockPanel.CENTER);
		
		ClientePrincipal clientePrincipal = new ClientePrincipal(false);
		showPanel.setWidget(clientePrincipal);
		clientePrincipal.setSize("auto", "100%");
		
		CaptionPanel cptnpnlIncidencias = new CaptionPanel("Incidencias");
		dockPanel_1.add(cptnpnlIncidencias, DockPanel.EAST);
		cptnpnlIncidencias.setSize("auto", "100%");
		
		final VerticalPanel verticalPanel_2 = new VerticalPanel();
		cptnpnlIncidencias.setContentWidget(verticalPanel_2);
		verticalPanel_2.setSize("5cm", "3cm");
		
		Timer t = new Timer(){
			public void run()
			{
				//servicio para refrescar incidencias
				//Window.alert("ff");
				serviciosIncidencia.listIncidencia(new AsyncCallback<List<IncidenciaDTO>>() {
					
					@Override
					public void onSuccess(List<IncidenciaDTO> result) {
						int tam = result.size();
						int tope= tam<15 ? tam:15;
						verticalPanel_2.clear();
						for (int i=0;i<tope;i++)
							verticalPanel_2.add(new Label(result.get(i).getDescripcion()));
					}
					
					@Override
					public void onFailure(Throwable caught) {
						System.out.println(caught.getMessage());
						Alerts.dialogErrorConexion();
					}
				});
				//llenarIncidencia();
			}
		};
		t.scheduleRepeating(10000);
	}

	protected void cambiaPanel(Composite composite) {
		showPanel.clear();
		showPanel.add(composite);
		composite.setVisible(true);
	}
}
